package com.sg.dto.integration.app;

import com.sg.common.dto.BaseDto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import javax.validation.constraints.NotNull;
import java.io.Serializable;
import java.util.Date;
import java.util.Objects;

/**
 * @desc ExecuteCycleStageDto
 * @使用场景
 */
@Data
public class ExecuteCycleStageDto extends BaseDto implements Serializable {

    /**
     * 执行周期阶段ID
     */
    @ApiModelProperty("执行周期阶段ID")
    private String executeCycleStageId;

    /**
     * 关联目标内容ID
     */
    @ApiModelProperty("关联目标内容ID")
    private String relateContentId;

    /**
     * 周期ID
     */
    @ApiModelProperty("周期ID")
    private String cycleId;

    /**
     * 是否父周期 TRUE:是 FALSE:否
     */
    @ApiModelProperty("是否父周期")
    private String isFatherCycle;

    /**
     * 是否子周期 TRUE:是 FALSE:否
     */
    @ApiModelProperty("是否子周期")
    private String isSubCycle;

    /**
     * 是否中期 TRUE:是 FALSE:否
     */
    @ApiModelProperty("是否中期")
    private String isMetaphase;

    /**
     * 是否当前周期 TRUE:是 FALSE:否
     */
    @ApiModelProperty("是否当前周期")
    private String isCurrentCycle;

    /**
     * 周期名称
     */
    @ApiModelProperty("周期名称")
    private String cycleStandardName;

    /**
     * 评价模板简称
     */
    @ApiModelProperty("评价模板简称")
    private String evaluationTempShortName;

    /**
     * 冗余目标ID
     */
    @ApiModelProperty("冗余目标ID")
    private String targetId;

    /**
     * 评价模板ID
     */
    @ApiModelProperty("评价模板ID")
    private String evaluationTemplateId;

    /**
     * 周期类型实例简称
     */
    @ApiModelProperty("周期类型实例简称")
    private String cycleNumberShortName;

    /**
     * 周期类型标识
     */
    @ApiModelProperty("周期类型标识")
    private String cycleTypeCode;

    /**
     * 是否自定义执行周期阶段 TRUE:是 FALSE:否
     */
    @ApiModelProperty("是否自定义执行周期阶段")
    private String isDefinedExecuteCycleStage;

    /**
     * 周期开始时间
     */
    @ApiModelProperty("周期开始时间")
    private Date cycleStartTime;

    /**
     * 周期结束时间
     */
    @ApiModelProperty("周期结束时间")
    private Date cycleEndTime;

    /**
     * 关联目标内容类型编码 TARGET:目标 TARGET_CATEGORY:目标分类 OBJECTIVE:指标
     */
    @ApiModelProperty("关联目标内容类型编码")
    private String relateContentTypeCode;

    /**
     * 是否过程周期阶段 TRUE:是 FALSE:否
     */
    @ApiModelProperty("是否过程周期阶段")
    private String isProcessCycleStage;

    /**
     * 排序
     */
    @ApiModelProperty("排序")
    private Long orderNumber;

    /**
     * 周期类型配置标识
     */
    @ApiModelProperty("周期类型配置标识")
    private String cycleTypeConfCode;

    /**
     * 填报开始时间
     */
    @ApiModelProperty("填报开始时间")
    private Date fillStartTime;

    /**
     * 是否父周期 TRUE:是 FALSE:否
     */
    @ApiModelProperty("是否父周期")
    private String isParentCycle;

    /**
     * 被评对象目标周期ID
     */
    @ApiModelProperty("被评对象目标周期ID")
    private String evaObjTargetCycleId;

    /**
     * 关联子周期执行阶段ID
     */
    @NotNull(message = "关联子周期执行阶段ID不能为空")
    @ApiModelProperty("关联子周期执行阶段ID")
    private String relateExecuteCycleStageId;

    /**
     * 周期类型实例标识
     */
    @ApiModelProperty("周期类型实例标识")
    private String cycleTypeInstanceCode;

    /**
     * 填报结束时间
     */
    @NotNull(message = "填报结束时间不能为空")
    @ApiModelProperty("填报结束时间")
    private Date fillEndtTime;

    /**
     * 评价开始时间
     */
    @ApiModelProperty("评价开始时间")
    private Date evaluateStartTime;

    /**
     * 评价结束时间
     */
    @ApiModelProperty("评价结束时间")
    private Date evaluateEndtTime;

    /**
     * 是否当前子周期（区分规划类型） TRUE:是 FALSE:否
     */
    @ApiModelProperty("是否当前子周期（区分规划类型）")
    private String isSameSceneCurrentSubCycle;

    /**
     * 是否下一末级或子周期 TRUE:是 FALSE:否
     */
    @ApiModelProperty("是否下一末级或子周期")
    private String isNextCycle;

    /**
     * 是否开始子周期 TRUE:是 FALSE:否
     */
    @ApiModelProperty("是否开始子周期")
    private String isStartCycle;

    /**
     * 是否截止子周期 TRUE:是 FALSE:否
     */
    @ApiModelProperty("是否截止子周期")
    private String isEndCycle;

    /**
     * 是否末级周期 TRUE:是 FALSE:否
     */
    @NotNull(message = "是否末级周期不能为空")
    @ApiModelProperty("是否末级周期")
    private String isLastCycle;

    /**
     * 最近可循环周期类型编码
     */
    @ApiModelProperty("最近可循环周期类型编码")
    private String nextCyclePeriod;

    /**
     * 评价模板创建时间
     */
    @NotNull(message = "评价模板创建时间不能为空")
    @ApiModelProperty("评价模板创建时间")
    private Date evaTempCreateTime;

    /**
     * 上一执行周期阶段ID
     */
    @ApiModelProperty("上一执行周期阶段ID")
    private String lastExecuteCycleStageId;

    /**
     * 归属评价主题ID
     */
    @ApiModelProperty("归属评价主题ID")
    private String evaluationSubjectId;

    /**
     * 主体生命周期 CURRENTLY_VALID:当前有效 EDITING:正在编辑 ARCHIVING:历史存档
     */
    @ApiModelProperty("主体生命周期")
    private String subjectLifeCycle;

    /**
     * 规划类型
     */
    @ApiModelProperty("规划类型")
    private String planningType;

    /**
     * 目标周期简称
     */
    @ApiModelProperty("目标周期简称")
    private String cyclelAlias;

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        if (!super.equals(o)) return false;
        ExecuteCycleStageDto that = (ExecuteCycleStageDto) o;
        return (
                executeCycleStageId == that.executeCycleStageId &&
                        relateContentId == that.relateContentId &&
                        cycleId == that.cycleId &&
                        isFatherCycle == that.isFatherCycle &&
                        isSubCycle == that.isSubCycle &&
                        isMetaphase == that.isMetaphase &&
                        isCurrentCycle == that.isCurrentCycle &&
                        cycleStandardName == that.cycleStandardName &&
                        evaluationTempShortName == that.evaluationTempShortName &&
                        targetId == that.targetId &&
                        evaluationTemplateId == that.evaluationTemplateId &&
                        cycleNumberShortName == that.cycleNumberShortName &&
                        cycleTypeCode == that.cycleTypeCode &&
                        isDefinedExecuteCycleStage == that.isDefinedExecuteCycleStage &&
                        cycleStartTime == that.cycleStartTime &&
                        cycleEndTime == that.cycleEndTime &&
                        relateContentTypeCode == that.relateContentTypeCode &&
                        isProcessCycleStage == that.isProcessCycleStage &&
                        orderNumber == that.orderNumber &&
                        cycleTypeConfCode == that.cycleTypeConfCode &&
                        fillStartTime == that.fillStartTime &&
                        isParentCycle == that.isParentCycle &&
                        evaObjTargetCycleId == that.evaObjTargetCycleId &&
                        relateExecuteCycleStageId == that.relateExecuteCycleStageId &&
                        cycleTypeInstanceCode == that.cycleTypeInstanceCode &&
                        fillEndtTime == that.fillEndtTime &&
                        evaluateStartTime == that.evaluateStartTime &&
                        evaluateEndtTime == that.evaluateEndtTime &&
                        isSameSceneCurrentSubCycle == that.isSameSceneCurrentSubCycle &&
                        isNextCycle == that.isNextCycle &&
                        isStartCycle == that.isStartCycle &&
                        isEndCycle == that.isEndCycle &&
                        isLastCycle == that.isLastCycle &&
                        nextCyclePeriod == that.nextCyclePeriod &&
                        evaTempCreateTime == that.evaTempCreateTime &&
                        lastExecuteCycleStageId == that.lastExecuteCycleStageId &&
                        evaluationSubjectId == that.evaluationSubjectId &&
                        subjectLifeCycle == that.subjectLifeCycle &&
                        planningType == that.planningType &&
                        cyclelAlias == that.cyclelAlias
        );
    }

    @Override
    public int hashCode() {
        return Objects.hash(
                super.hashCode(),
                executeCycleStageId,
                relateContentId,
                cycleId,
                isFatherCycle,
                isSubCycle,
                isMetaphase,
                isCurrentCycle,
                cycleStandardName,
                evaluationTempShortName,
                targetId,
                evaluationTemplateId,
                cycleNumberShortName,
                cycleTypeCode,
                isDefinedExecuteCycleStage,
                cycleStartTime,
                cycleEndTime,
                relateContentTypeCode,
                isProcessCycleStage,
                orderNumber,
                cycleTypeConfCode,
                fillStartTime,
                isParentCycle,
                evaObjTargetCycleId,
                relateExecuteCycleStageId,
                cycleTypeInstanceCode,
                fillEndtTime,
                evaluateStartTime,
                evaluateEndtTime,
                isSameSceneCurrentSubCycle,
                isNextCycle,
                isStartCycle,
                isEndCycle,
                isLastCycle,
                nextCyclePeriod,
                evaTempCreateTime,
                lastExecuteCycleStageId,
                evaluationSubjectId,
                subjectLifeCycle,
                planningType,
                cyclelAlias
        );
    }

}
